/**
 * 保留任意位小数
 * @param number 数值
 * @param precision 保留小数位数
 * @param toFixed 是否四舍五入
 * @param isNumber 返回值是否为数值类型
 * @returns {any}
 */
export default function toDecimal(number, precision = 2, toFixed = true, isNumber = true) {
	(number == undefined || number == null || number == "" || Number.isNaN(number)) && (number = 0)
	let newNumber = String(number);
	let prefix = '';
	if (newNumber.indexOf('-') === 0) {
		prefix = '-';
		newNumber = newNumber.substr(1);
	}
	let arr = newNumber.split(".");
	arr[0] == '' && (arr[0] = 0);
	// 如果不是小数，补充对应的0
	if (arr.length === 1) {
		return isNumber ? Number(newNumber) : (newNumber + "." + "0".repeat(precision))
	} else {
		// 如果是小数 但位数比要保留的位数少 也是要补0
		if (arr[1].length <= precision) {
			return isNumber ? Number(newNumber) : (newNumber + "0".repeat(precision - arr[1].length));
		} else {

			let intNumber = parseInt(arr[0]); // 整数部分

			let decimal = String(arr[1]); // 所有小数部分

			let frontDecimal; //有效小数部分

			if (Number(decimal) == 0) {
				frontDecimal = 0
			} else {
				if (decimal.length <= precision) {
					//小数量小于所需小数位
					frontDecimal = decimal;
				} else {
					//小数量大于所需小数位
					frontDecimal = (precision > 0 ? (decimal.substr(0, precision)) : 0) * 1;

					let moreDecimal = parseInt(decimal.substr(precision, 1));

					let spliceNumber = decimal.substr(precision, 5);
					if (spliceNumber === '49999') {
						moreDecimal += 1;
					}
					if (moreDecimal >= 5) {
						frontDecimal += 1;
					}
					//判断小数部位是否需要进位 类似于19.996 保留2位小数 就是20.00
					if (frontDecimal === Math.pow(10, precision)) {
						frontDecimal = '0'.repeat(precision)
						intNumber += 1;
					}
					//处理 0.015 0.009 保留的小数中有0出现的情况
					if (String(frontDecimal).length < precision) {
						frontDecimal = '0'.repeat(precision - String(frontDecimal).length) + frontDecimal
					}
				}
			}

			return isNumber ? Number(`${prefix}${intNumber}.${frontDecimal}`) : `${prefix}${intNumber}.${frontDecimal}`
		}
	}
}
